#函数function.是一块代码的集合，将代码封装到函数中可以保证代码的整体性、复用性、可维护性
#1、定义函数  def 函数名():
# def f1():
#     for i in range(1, 10):
#         for j in range(1, i + 1):
#             print(f'{i}x{j}={i*j}', end='  ')
#         print()

#2、调用函数，函数名()
# f1()
# f1()
# f1()

#3、函数必须先定义，再调用
# f1()        # NameError: name 'f1' is not defined
# def f1():
#     print('Hello')
# f1()

#4、函数不调用，默认不执行
# def f1():
#     print(123)

#5.1、函数的形参与实参
# def f1(a,b):
#     print(f'a={a},b={b}')
# f1(5,2)
# f1('小明','小张')

#5.2、位置参数
#实参的数量，必须与形参保持一致，不能多，也不能少
#实参的位置，必须与形参保持一致
# def f1(a,b):
#     print(f'a={a},b={b}')
# #f1(5)          #TypError: f1() missing 1 required positional argument: 'b'
# # f1(5,8,9)     #TypeError: f1() takes 2 positional arguments but 3 were giver
# f1('bbb','aaa')

#5.3、关键字参数
# def f1(a,b):
#     print(f'a={a},b={b}')
# f1('bbb','aaa')
# f1(b='bbb',a='aaa')         #在传递实参时，利用形参的名字进行指定传参

#5.4、默认值参数
# def f1(a='小明',b='想喝粥'):     #定义函数时，给形参指定了默认值
#     print(f'a={a},b={b}')
# f1()                #不传递实参，形参就取默认值
# f1(a='123')         #传递实参，形参取实参的值
# f1(b='不吃牛肉')

#5.5、数量可变形参
    #在形参的名字前面添加*，可以让这个形参接受n多个实参
    #可变形参不能写在其他形参前面
    #一个函数中只能有一个可变形参
# def f1(a='小明',b='小喝粥',*c):
#     print(f'a={a},b={b}')
#     print(f'c={c}')
# f1(111,222)                     #传递了2个实参，可变参数c是一个空元组
# f1(111,222,333)                 #传递了3个实参，可变参数c拥有1个元素
# f1(111,222,333,444,555,666)     #传递n个实参，第1个给a，第2个给b，多出来的全部给c组成元组

#打印一个2*3的矩阵，再打印一个2*4的矩阵，再打印一个2*5的矩阵
# def f1(a,b):
#     for i in range(1,a+1):
#         for j in range(1, b + 1):
#             print(f'{i}x{j}={i*j}', end='  ')
#         print()
# f1(2,5)

#6、函数的返回值return
    #print()是将括号中的内容打印到控制台，给人看的，程序本身不需要print
    #函数没有return，它的结果就是None(空值)
    #函数有return，它的结果就是return后面的内容(与函数本身没有任何关系)
# def f1(a,b):
#     s=a+b
# def f2(a,b):
#     s=a+b
#     return 'xixi'
# print(f1(5,8))
# print(f2(5,8))

#练习:有1个3位数n，它的3个位数之和是25，同时n+9的3个位数之和也是25，用代码找出这个数
#写一个函数，接受形参n，如果n的3个位数之和是9就返回True，否则返回False
# def f1(n):
#     a=int(str(n)[0])
#     b=int(str(n)[1])
#     c=int(str(n)[2])
#     if a+b+c==25:
#         return True
#     else:
#         return False
# #遍历100-999，如果f1(n)和f1(n+9)都返回True，说明n就是要找的数字
# for i in range(100,999+1):
#     if f1(1)==True and f1(1+9)==True:
#         print(i)

#while是条件循环，循环依据是条件成立，一旦条件不成立就结束循环
#for是遍历循环，循环依据是遍历对象的元素个数，元素有多少个，就循环多少次

# def f2(m,n):
#     for i in range(100, 999 + 1):
#         a = int(str(i)[0])
#         b = int(str(i)[1])
#         c = int(str(i)[2])
#         t=i+m
#         d = int(str(t)[0])
#         e = int(str(t)[1])
#         f = int(str(t)[2])
#         if a + b + c == n and d + e + f == n:
#             print(i)
# f2(9,25)

#定义一个函数f1，接受形参year和month，返回'year年month月有day天'
    #例如f1(2025,2)，返回值是'2025年2月有28天'
    #例如f1(2024,2)，返回值是'2025年2月有29天'
# def f1(year,month):
#     day=[0,31,28,31,30,31,30,31,31,30,31,30,31]
#     if year%4==0 and year%100!=0 or year%400==0:
#         day[2]=29
#     return f'{year}年{month}月有{day[month]}天'
# print(f1(2025,2))
# print(f1(2024,2))
# print(f1(2025,1))
# print(f1(2025,12))

# 编写一个函数，接受两个字符串作为参数，返回它们拼接后的结果，并在中间添加一个空格。
def f1(a,b):
    return f'{a} {b}'
print(f1('abc','def'))

#编写一个函数，接受任意数量的整数参数，返回这些数字中的最大值。
def f2(*a):
    return max(a)
print(f2(45,15,58,42,91,63))